package tools

// GenerateTree 利用泛型函数实现通用平行数据转树数据的方法，
// 利用泛型接口的方式试过了，没搞定，感觉很不舒服，暂时不想挑战了，相关代码已经删除
func GenerateTree[T any](
	t []T,
	id func(*T) string,
	pid func(*T) string,
	appendChild func(p *T, c *T),
	isRoot func(*T) bool) []*T {
	dict := make(map[string]*T)
	var result []*T
	length := len(t)
	for i := 0; i < length; i++ {
		v := &t[i]
		dict[id(v)] = v
	}
	for i := 0; i < length; i++ {
		v := &t[i]
		pv := dict[pid(v)]
		if isRoot(v) || pv == nil {
			result = append(result, v)
		} else {
			appendChild(pv, v)
		}
	}
	return result
}

type TreeNode struct {
	ID       string      `json:"id"`
	ParentId string      `json:"parentId"`
	Text     string      `json:"text,omitempty"`
	Children []*TreeNode `json:"children,omitempty"`
	Ext1     string      `json:"ext1"`
	Ext2     string      `json:"ext2"`
	Ext3     string      `json:"ext3"`
}

func (r *TreeNode) IsRoot() bool {
	return r.ParentId == ""
}
func (r *TreeNode) AppendChild(res *TreeNode) {
	r.Children = append(r.Children, res)
}

// GenerateTreeData 通过固定结构TreeNode的方式生成树数据
func GenerateTreeData(data []TreeNode) []*TreeNode {
	length := len(data)
	var result []*TreeNode
	var dict = make(map[string]*TreeNode, length)
	for i, item := range data {
		dict[item.ID] = &data[i]
	}
	for index, item := range data {
		if item.IsRoot() || dict[item.ParentId] == nil {
			result = append(result, &data[index])
		} else {
			dict[item.ParentId].AppendChild(&data[index])
		}
	}
	return result
}
